package com.sdl.timesblogmp.security;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * @author sdl
 * @date 2020/5/12 10:02 上午
 * @description
 */
@Component
public class JwtService {
    // 令牌自定义标识
    @Value("${token.header}")
    private String header;

    // 令牌秘钥
    @Value("${token.prefix}")
    private String prefix;

    // 令牌秘钥
    @Value("${token.secret}")
    private String secret;

    // 令牌有效期（默认30分钟）
    @Value("${token.expireTime}")
    private int expireTime;

    /**
     * 根据用户名签发token
     * @param userName
     * @return
     */
    public String createToken(String userName) {
        Date date = new Date(System.currentTimeMillis() + expireTime * 60 * 1000);
        String token =  Jwts.builder()
                        .setSubject(userName)
                        .setExpiration(date)
                        .signWith(SignatureAlgorithm.HS256,secret)
                        .compact();
        return prefix + token;
    }

    /**
     * 根据token获取claims
     * @param token
     * @return
     */
    public Claims parseToken(String token){
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 根据token获取Subject 用户
     * @param token
     * @return
     */
    public String getUserName(String token){
        return  parseToken(token).getSubject();
    }

    /**
     * 从Header中取出token
     * @param request
     * @return
     */
    public String getToken(HttpServletRequest request){
        String token = request.getHeader(header);
        if (StringUtils.isEmpty(token) || !token.startsWith(prefix)){
            return null;
        }
        return token.replace(prefix,"");
    }

}
